/**
 *                            License
 * THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS  
 * CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). 
 * THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW.  
 * ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR  
 * COPYRIGHT LAW IS PROHIBITED.
 * 
 * BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND  
 * AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE  
 * MAY BE CONSIDERED TO BE A CONTRACT,
 * THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED 
 * HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
 * 
 */
package lineage.model.map;

import lineage.util.L1Point;

/**
 * 地图接口.
 * 
 * @version 2014年4月5日下午2:54:55
 * @author jrwz
 */
public abstract class L1Map {
    /**
     * 取得地图编号.
     * 
     * @return 地图编号
     */
    public abstract int getMapId();

    /**
     * 取得坐标X.
     * 
     * @return 坐标X
     */
    public abstract int getX();

    /**
     * 取得坐标Y.
     * 
     * @return 坐标Y
     */
    public abstract int getY();

    /**
     * 地图宽度(终点X - 起点X).
     * 
     * @return 宽度
     */
    public abstract int getWidth();

    /**
     * 地图高度(终点Y - 起点Y).
     * 
     * @return 高度
     */
    public abstract int getHeight();

    /**
     * 指定的坐标在当前地图是否有效.
     * 
     * @param x
     *            - x坐标
     * @param y
     *            - y坐标
     * @return 如果有效则返回true
     */
    public abstract boolean isInMap(int x, int y);

    /**
     * 指定的坐标在当前地图是否有效.
     * 
     * @param pt
     *            - 坐标位置
     * @return 如果有效则返回true
     */
    public abstract boolean isInMap(L1Point pt);

    /**
     * 设置障碍.
     * 
     * @param x
     *            - x坐标
     * @param y
     *            - y坐标
     * @param isPassable
     *            - 能否通过
     * @param door
     *            - 门(0：／、1：＼、2：一般)
     */
    public abstract void setPassable(int x, int y, boolean isPassable, int door);

    /**
     * 设置障碍.
     * 
     * @param pt
     *            - 坐标位置
     * @param isPassable
     *            - 能否通过
     */
    public abstract void setPassable(L1Point pt, boolean isPassable);

    /**
     * 能否通过.
     * 
     * @param x
     *            - x坐标
     * @param y
     *            - y坐标
     */
    public abstract boolean isPassable(int x, int y);

    /**
     * 能否通过.
     * 
     * @param pt
     *            - 坐标位置
     */
    public abstract boolean isPassable(L1Point pt);

    /**
     * 能否通过.
     * 
     * @param x
     *            - x坐标
     * @param y
     *            - y坐标
     * @param heading
     *            - 面向
     */
    public abstract boolean isPassable(int x, int y, int heading);

    /**
     * 能否通过.
     * 
     * @param pt
     *            - 坐标位置
     * @param heading
     *            - 面向
     */
    public abstract boolean isPassable(L1Point pt, int heading);

    /**
     * 取得指定坐标的值.
     * <p>
     * 不推荐、只有在特殊场合才使用此方法
     * 
     * @param x
     *            - x坐标
     * @param y
     *            - y坐标
     * @return 指定坐标的值
     */
    public abstract int getTile(int x, int y);

    /**
     * 取得指定坐标的值.
     * <p>
     * 不推荐、只有在特殊场合才使用此方法
     * 
     * @param x
     *            - x坐标
     * @param y
     *            - y坐标
     * @return 指定坐标的值(0：无法通过、15：一般区域、16：装饰物件、31：安全区域、47：战斗区域)
     */
    public abstract int getOriginalTile(int x, int y);

    /**
     * 是否为‘一般区域’.
     * 
     * @param x
     *            - x坐标
     * @param y
     *            - y坐标
     * @return 是则返回true
     */
    public abstract boolean isNormalZone(int x, int y);

    /**
     * 是否为‘一般区域’.
     * 
     * @param pt
     *            - 坐标位置
     * @return 是则返回true
     */
    public abstract boolean isNormalZone(L1Point pt);

    /**
     * 是否为‘安全区域’.
     * 
     * @param x
     *            - x坐标
     * @param y
     *            - y坐标
     * @return 是则返回true
     */
    public abstract boolean isSafetyZone(int x, int y);

    /**
     * 是否为‘安全区域’.
     * 
     * @param pt
     *            - 坐标位置
     * @return 是则返回true
     */
    public abstract boolean isSafetyZone(L1Point pt);

    /**
     * 是否为‘战斗区域’.
     * 
     * @param x
     *            - x坐标
     * @param y
     *            - y坐标
     * @return 是则返回true
     */
    public abstract boolean isCombatZone(int x, int y);

    /**
     * 是否为‘战斗区域’.
     * 
     * @param pt
     *            - 坐标位置
     * @return 是则返回true
     */
    public abstract boolean isCombatZone(L1Point pt);

    /**
     * 该区域‘箭(远程攻击)’能否通过.
     * 
     * @param x
     *            - x坐标
     * @param y
     *            - y坐标
     * @return 是则返回true
     */
    public abstract boolean isArrowPassable(int x, int y);

    /**
     * 该区域‘箭(远程攻击)’能否通过.
     * 
     * @param pt
     *            - 坐标位置
     * @return 是则返回true
     */
    public abstract boolean isArrowPassable(L1Point pt);

    /**
     * 该区域‘箭(远程攻击)’能否通过.
     * 
     * @param x
     *            - x坐标
     * @param y
     *            - y坐标
     * @param heading
     *            - 面向
     * @return 是则返回true
     */
    public abstract boolean isArrowPassable(int x, int y, int heading);

    /**
     * 该区域‘箭(远程攻击)’能否通过.
     * 
     * @param pt
     *            - 坐标位置
     * @param heading
     *            - 面向
     * @return 是则返回true
     */
    public abstract boolean isArrowPassable(L1Point pt, int heading);

    public abstract String toString(L1Point pt);
}